package org.jsola.contract.service;

import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.jsola.contract.dto.*;
import org.jsola.contract.entity.ContractDO;
import org.jsola.contract.vo.ContractVO;
import org.jsola.core.Result;
import org.jsola.user.core.TokenUser;

import java.util.List;
import java.util.Map;

/**
 * @author JanusMix
 */
public interface ISignService {

    /**
     * 发送验证码
     *
     * @param tokenUser 当前登录用户
     * @return 发送验证码的结果
     */
    Result<Boolean> sendCode(TokenUser tokenUser);

    /**
     * 发起模板签署
     *
     * @param publishSignDTO dto
     * @param tokenUser      当前登录用户
     * @return 合同信息
     */
    List<ContractVO> publishTemplateSign(PublishSignDTO publishSignDTO, TokenUser tokenUser);

    /**
     * 发起模板签署(异步，不加锁 单人)
     *
     * @param publishSignSigngleDTO publishSignSigngleDTO
     * @param showDiffSite          合同文件是否在不同站点显示
     * @param tokenUser             当前登录用户
     * @return 合同信息
     */
    List<ContractVO> publishTemplateSignSingle(PublishSignSigngleDTO publishSignSigngleDTO, boolean showDiffSite, TokenUser tokenUser);

    /**
     * 替换合同信息
     *
     * @param tokenUser 当前登录用户
     * @return 合同路径
     */
    List<String> modifyContract(List<ContractDO> contractDOList, Long sealId, TokenUser tokenUser);

    /**
     * 发起模板单方签署,发起的合同可以在不同站点下显示
     *
     * @param publishSignDTO dto
     * @param tokenUser      当前登录用户
     * @return 合同信息
     */
    List<ContractVO> publishTemplateSignDiffSite(PublishSignDTO publishSignDTO, TokenUser tokenUser);

    /**
     * 替换合同的变量
     *
     * @param content              合同文本
     * @param variableList         变量列表
     * @param contractVariableList 变量统计数据（需要的话）
     * @return 替换后的文本
     */
    String substitutionVariable(String content, List<Map<String, Object>> variableList, List<ContractVariableAddDTO> contractVariableList);

    /**
     * 合同重新发起,替换签署确认时间为当前时间
     *
     * @param contractId 合同id
     * @param companyId  公司id
     * @param tokenUser  当前登录用户
     */
    void contractSignAgain(Long contractId, String companyId, TokenUser tokenUser);

    /**
     * 合同重新发起,替换签署确认时间为当前时间
     *
     * @param contractId   合同id
     * @param companyId    公司id
     * @param bytes        文件字节流
     * @param showDiffSite 是否在不同站点显示
     * @param tokenUser    当前登录用户
     */
    void contractSignAgain2(Long contractId, String companyId, byte[] bytes, boolean showDiffSite, TokenUser tokenUser);

    void contractSignAgainAsync(Long contractId, String companyId, TokenUser tokenUser);

    /**
     * 企业单方签署发送通知
     *
     * @param weiXinSend 发送参数
     * @param tokenUser  当前用户
     */
    void sendWaitViewWeiXinTemp(SignWeiXinSendDTO weiXinSend, TokenUser tokenUser);

    /**
     * 个人签署方签署
     *
     * @param contractId 合同id
     * @param sealString 手写印章图片base64
     * @param code       验证码
     * @param isBlank    是否为空白签署
     * @param tokenUser  当前登录用户
     */
    void personSign(Long contractId, String sealString, String code, boolean isBlank, TokenUser tokenUser);

    /**
     * 个人签署方签署
     *
     * @param contractId 合同id
     * @param tokenUser  当前登录用户
     */
    /**
     * 个人签署方签署_君子签回调
     *
     * @param contractId   合同id
     * @param stream       文件流
     * @param showDiffSite 是否在不同站点显示
     * @param tokenUser    当前登录用户
     */
    void personSign2(Long contractId, byte[] stream, Boolean showDiffSite, TokenUser tokenUser);

    /**
     * 个人签署方签署,签署的合同不同站点可以看
     *
     * @param contractId 合同id
     * @param sealString 手写印章图片base64
     * @param code       验证码
     * @param tokenUser  当前登录用户
     */
    void personSignDiffSite(Long contractId, String sealString, String code, TokenUser tokenUser);

    /**
     * 无验证码校验的个人签署方签署
     *
     * @param contractId 合同id
     * @param sealString 手写印章图片base64
     * @param tokenUser  当前登录用户
     */
    void personSignNoPhone(Long contractId, String sealString, TokenUser tokenUser);

    /**
     * 企业签署方签署
     *
     * @param companyId  公司id
     * @param contractId 合同id
     * @param tokenUser  当前登录用户
     */
    void enterpriseSign(String companyId, Long contractId, TokenUser tokenUser);

    /**
     * 企业签署方签署,合同在不同站点中显示
     *
     * @param companyId  公司id
     * @param contractId 合同id
     * @param tokenUser  当前登录用户
     */
    void enterpriseSignDiffSite(String companyId, Long contractId, TokenUser tokenUser);

    /**
     * 个人与企业签署合同,个人签署完成后,企业也进行签署,签署的合同同站点可以看
     *
     * @param contractId 合同id
     * @param companyId  公司id
     * @param sealString 个人手写印章图片base64
     * @param code       个人收到的验证码
     * @param tokenUser  当前登录用户
     */
    void personAndEnterpriseSign(Long contractId, String companyId, String sealString, String code, TokenUser tokenUser);


    /**
     * 个人与企业签署合同,个人签署完成后,企业也进行签署,签署的合同不同站点可以看
     *
     * @param contractId 合同id
     * @param companyId  公司id
     * @param sealString 个人手写印章图片base64
     * @param code       个人收到的验证码
     * @param tokenUser  当前登录用户
     */
    void personAndEnterpriseSignDiffSite(Long contractId, String companyId, String sealString, String code, TokenUser tokenUser);


    /**
     * 发起多方模板签署
     *
     * @param templateId                   模板id
     * @param categoryId                   分类id
     * @param contractName                 合同名称
     * @param enterprisePartyAccountIdList 企业签署方账户id列表
     * @param personalPartyAccountIdList   个人签署方账户id列表
     * @param tokenUser                    当前登录用户
     */
    void publishTemplateMultiSign(Long templateId, Long categoryId, String contractName, List<String> enterprisePartyAccountIdList,
                                  List<String> personalPartyAccountIdList, TokenUser tokenUser);

    /**
     * 根据上传的word企业签署
     *
     * @param publishWordCompanySignDTO dto
     * @param tokenUser                 当前登录用户
     */
    void wordSignCompany(PublishWordCompanySignDTO publishWordCompanySignDTO, TokenUser tokenUser);

    /**
     * 根据上传的word个人签署
     *
     * @param publishWordPeopleSignDTO dto
     * @param tokenUser                当前登录用户
     */
    void wordSignPeople(PublishWordPeopleSignDTO publishWordPeopleSignDTO, TokenUser tokenUser);


}
